package servicios;

import java.net.URI;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import modelo.datos.Empresa;
import persistencia.BaseDatos;
import persistencia.BaseDatosImpl;

@Path("clientes")
public class FacturacionREST {
    private static final BaseDatos datos = new BaseDatosImpl();
    @Context
    private UriInfo uriInfo;

   /* @GET
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Response devuelveTodasEntradas() {
	return Response.ok(datos.getEntradas()).build();
    }*/

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Response devuelveTodasEntradas(@Context Request request) {
        EntityTag tag = new EntityTag(datos.hashCode()+"");
        ResponseBuilder responseBuilder = request.evaluatePreconditions(tag);
        if(responseBuilder != null)
            return responseBuilder.build();
        return Response.ok(datos.getEntradas()).tag(tag).build();
    }
    
    @Path("{nif}")
    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public Response buscarEntradaPorNIF(@PathParam("nif") String nif,@Context Request request) {
	Empresa empresa = datos.buscaEntradaPorNIF(nif);
	if (empresa == BaseDatosImpl.ENTRADA_NULL)
	    return Response.status(Status.NOT_FOUND).build();
	EntityTag tag = new EntityTag(datos.hashCode()+"");
        ResponseBuilder responseBuilder = request.evaluatePreconditions(tag);
        if(responseBuilder != null)
            return responseBuilder.build();
        return Response.ok(empresa).tag(tag).build();
    }
    
   /* @Path("{nif}")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Response mostrarEntrada(@Context Request request) {
        EntityTag tag = new EntityTag(datos.hashCode()+"");
        ResponseBuilder responseBuilder = request.evaluatePreconditions(tag);
        if(responseBuilder != null)
            return responseBuilder.build();
        return Response.ok(datos.getEntradas()).tag(tag).build();
    }*/

    /*
     * @POST
     * 
     * @Consumes(MediaType.APPLICATION_XML) public Response nuevaPersona(Persona
     * persona) { }
     */

    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response nuevaEntradaDesdeFormulario(
	    @FormParam("nombre") String nombre,
	    @FormParam("apellidos") @DefaultValue("") String apellidos,
	    @FormParam("nif") String nif,
	    @FormParam("poblacion") String poblacion,
	    @FormParam("provincia") String provincia) {
	String direccion = poblacion +"-"+provincia;
	Empresa empresa = new Empresa(nombre, nif,direccion);
	datos.nuevaEntrada(empresa);
	UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
	URI uri = uriBuilder.path(nif).build();
	return Response.created(uri).build();

    }

    @Path("{nif}")
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public Response actualizarEntradaDesdeXML(Empresa e,
	    @PathParam("nif") String nif) {
	if (nif.equals(e.getNif())) {
	Empresa empresa = datos.buscaEntradaPorNIF(nif);
	if (empresa.equals(BaseDatosImpl.ENTRADA_NULL)) {
	    datos.nuevaEntrada(e);
	    return Response.status(Status.NO_CONTENT).build();
	} else {
	    datos.actualizaEntrada(e);
	    return Response.ok(e).build();
	}
	}
	else
	    return Response.status(Status.CONFLICT).build();
    }
    @Path("{nif}")
    @DELETE
    @Produces(MediaType.APPLICATION_XML)
    public Response BorraEntradaDesdeXML(@PathParam("nif") String nif) {
	Empresa empresa = datos.buscaEntradaPorNIF(nif);
	if (empresa != BaseDatosImpl.ENTRADA_NULL) {
	    datos.borraEntrada(nif);
	    return Response.status(Status.NO_CONTENT).build();
	} else {
	    return Response.ok("Empresa no encontrada").build();
	}
    }
}